热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无监督学习|PCA主成分分析原理及Sklearn实现

文章目录1.降维2.PCA2.1最大化方差和最小化损失2.2坐标轴旋转3.PCA推导3.1PCA算法推导3.2维数选择4.Sklearn实现4.1主成分可视化5.在线可视化网站参考


文章目录

  • 1. 降维
  • 2. PCA
    • 2.1 最大化方差和最小化损失
    • 2.2 坐标轴旋转
  • 3. PCA 推导
    • 3.1 PCA 算法推导
    • 3.2 维数选择
  • 4. Sklearn 实现
    • 4.1 主成分可视化
  • 5. 在线可视化网站
  • 参考文献



相关文章:

机器学习 | 目录

无监督学习 | PCA 主成分分析之客户分类


1. 降维

假设你在使用一组数据来预测房价,你的数据包含以下特征:


  1. 房子面积

  2. 房间数量

  3. 附近学校排名

  4. 社区安全

但是可以看出,1、2 在于描述房子的大小,而 3、4 在描述周边环境。因此我们可以用两个新的特征来预测房价:1. 房子大小;2. 周边环境,我们称之为潜在变量。现在可能我们有很多可测量的特征,但或许只有少量的潜在特征,其中包含大部分的信息。

在本文中,我们主要讨论的是如何将维度降低,降低维度的方法有两种:1.特征选择,2. 特征提取

特征选择指的是从已有变量中选择较少的变量,如用“房子面积”来描述“房子大小”,用“社区安全”来描述“周边环境”,如逐步回归,在 Sklearn 中用 SelectKBest 选择K个最合适的特征,或用 SelectPercentile 选取前百分比的特征。

特征提取则是对同一类的变量进行融合,假设现在有很多特征可以使用,但只有一分布特征在驱动这个数据模式。因此我们希望找出一个组合特征(omposite feature,又称为主成分 principle component),从而将一大堆特征缩减至几个特征。如将“房子面积”和“房间数量”融合为“房子大小”,将“附近学校排名”和“社会安全”融合为“周边环境”,这就是降维,将维数从 4 降到了 2。

主成分分析(Principal Component Analysis, PCA)是最常用的一种降维方法,除此之外还有增量主成分分析(IPCA)、核主成分分析(KPCA)、局部线性嵌入(LLE)、多维缩放(SDA)、等度量映射(Isomap)、t-分布随机近邻嵌入(t-SNE)和线性判别(LDA)。[1]


2. PCA

假设下面是房子面积和房间数量的散点图,X 轴为房子面积,Y 轴为房间数量:



图1 房子面积与房间数量散点图

首先我们可以画出他们的主成分,如下所示:



图2 房子面积与房间数量的主成分

这看起来像个回归问题,但并不是这样的。在回归中,我们的目的是预测与输入值对应的输出值,在这里,我们并不是要预测任何值,而是算出数据的大致方向,使得我们的数据能够在尽量少地损失信息的同时映射在该方向上。

当我们找到了数据的主成分后,也就是向量的方向后,我们可以对数据进行一个映射,如下所示,我们的原始数据是二维的,但是,当我们把映射到主成分上之后,它就变成一维数据了。



图3 数据映射

下面,我将介绍如何确定主成分。


2.1 最大化方差和最小化损失

对于我们的数据,可以用一个椭圆,这个椭圆可以用两个参数来表示:短轴的距离和长轴的距离,可以看到,在长轴上,数据更加的分散,即方差更大。我们要做的就是找到方差最大的方向。



图4 方差最大化

为什么我们要找出具有最大方差的方向呢。换而言之,当我们在进行映射时,为什么要将所有数据点映射到方差最大的方向上呢?这是因为当我们沿着方差最大的方向进行映射时,它能够在最大程度上保留原有数据中所含信息。

当我们对数据进行映射时,就会造成信息损失,信息的损失量就等于某个特定的点与它在这条线上的新位置之间的距离



图5 信息损失

可以看到,对于图 5 的右图而言,此时数据在该方向上映射的方差最小,但信息损失也就最大。因此当我们将方差最大化的同时,实际上是将点与其在该线上的投影之间的距离最小化,即最小化信息损失。


2.2 坐标轴旋转

PCA 实际上是先对坐标轴进行旋转,通过计算数据映射在每个方向上的后的方差,选取前 K 个方差最大的特征。


3. PCA 推导


3.1 PCA 算法推导

假设输入样本为 Z={Z1,Z2,...,Zm}Z=\{Z_1,Z_2,...,Z_m\}Z={Z1,Z2,...,Zm},我们要通过 PCA 从 mmm 维降至 kkk 维,首先对样本进行中心化,即对每个属性减去其对应的均值:

X={Z1−Z1ˉ,Z2−Z2ˉ,...,Zm−Zmˉ}={X1,X2,...,Xm}(1)\begin{aligned} X & = \{Z_1-\bar{Z_1}, Z_2-\bar{Z_2}, ...,Z_m-\bar{Z_m} \} \\ & = \{X_1,X_2,...,X_m\}\\ \end{aligned}\tag{1} X={Z1Z1ˉ,Z2Z2ˉ,...,ZmZmˉ}={X1,X2,...,Xm}(1)

假设经过旋转后新的坐标为 XT⋅WX^T \cdot WXTW,其中 WWW 为单位正交基向量矩阵(WT⋅W=EW^T \cdot W =EWTW=E),因此要最大化投影间隔,即最大化其方差 WTXXTWW^T X X^T WWTXXTW(中心化后均值为 0):

max⁡W{WTXXTW}s.t.WTW=E(2)\begin{aligned} & \max \limits_{W} \{W^T X X^T W\} \\ & s.t. W^T W =E \\ \end{aligned}\tag{2} Wmax{WTXXTW}s.t.WTW=E(2)

由拉格朗日乘数法得:

WTXXTW+λ[E−WTW](3)W^T X X^T W + \lambda [E-W^T W] \tag{3}WTXXTW+λ[EWTW](3)

WWW 求导得:

∂∂W{WTXXTW+λ[E−WTW]}=2XXTW−2λEW=0(4)\frac{\partial}{\partial W}\bigg\{W^T X X^T W + \lambda [E-W^T W]\bigg\} = 2X X^T W - 2\lambda E W =0 \tag{4}W{WTXXTW+λ[EWTW]}=2XXTW2λEW=0(4)

因此有:

XXTw=λW(5)XX^Tw=\lambda W \tag{5}XXTw=λW(5)

(λE−XXT)W=0(6)(\lambda E - XX^T)W=0 \tag{6}(λEXXT)W=0(6)

其中 XXTXX^TXXT 为样本 ZZZ 的协方差矩阵,λ\lambdaλXXTXX^TXXT 的特征值,WWWXXTXX^TXXT 的特征向量。

将式 (5) 代入式 (2) 可得:

max{WTXXTW}=max{WTλW}=max{λWWT}=maxλE(7)\begin{aligned} & max\{W^T X X^T W\} \\ = & max\{W^T\lambda W\} \\ = & max\{\lambda WW^T\} \\ = & max{\lambda E} \\ \end{aligned}\tag{7} ===max{WTXXTW}max{WTλW}max{λWWT}maxλE(7)

于是,只需要对协方差矩阵 XXTXX^TXXT进行特征值分解,将求得的特征值排序:λ1≥,λ2≥,...,λm\lambda_1 \geq,\lambda_2 \geq,...,\lambda_mλ1,λ2,...,λm,再取前 kkk 个特征值对应的特征向量构成投影矩阵 W=(w1,w2,...,wk)W = (w_1,w_2,...,w_k)W=(w1,w2,...,wk),这就是主成分分析的解。

主成分所占整个信息的百分比可以用下式计算:

∑i=1kλi∑i=1mλi(8)\frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \tag{8}i=1mλii=1kλi(8)

PCA 算法描述如下图所示:



图6 PCA 算法

实践中常通过对 X 进行奇异值(SVD)分解来代替协方差矩阵的特征值分解。



3.2 维数选择

降维后低维空间的维数 kkk 通常是实现指定的,或通过在 kkk 值不同的低维空间中对 KNN 分类器(或其他开销较小的学习器)进行交叉验证来选去较好的 kkk 值。对 PCA,还可以从重构的角度设置一个重构阈值,例如 t=95%t=95\%t=95%,然后选择使下式成立的最小 kkk 值:[2]

∑i=1kλi∑i=1mλi≥t(9)\frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \geq t \tag{9}i=1mλii=1kλit(9)


显然,低维空间与原始高维空间必有不同,因为对应于最小的 m-k 个特征值的特征向量被舍弃了,这是降维导致的结果。但是舍弃这部分信息往往是必要的:一方面,舍弃这部分信息之后能使样本的采样密度增大,这正是降维的重要动机;另一方面,当数据收到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃能在一定程度起到去除噪声的效果。



4. Sklearn 实现

sklearn.decomposition.PCA (n_compOnents=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

n_compoents:主成分数量,当为 0.0 到 1.0 之间的浮点数时,表示希望保留的方差比。



Methods

fit(self, X[, y]) Fit the model with X.

fit_transform(self, X[, y]) Fit the model with X and apply the dimensionality reduction on X.

get_covariance(self) Compute data covariance with the generative model.

get_params(self[, deep]) Get parameters for this estimator.

get_precision(self) Compute data precision matrix with the generative model.

inverse_transform(self, X) Transform data back to its original space.

score(self, X[, y]) Return the average log-likelihood of all samples.

score_samples(self, X) Return the log-likelihood of each sample.

set_params(self, **params) Set the parameters of this estimator.

transform(self, X) Apply dimensionality reduction to X.



查看 PCA 的详细信息:

components_:主成分

explained_variance_:解释方差

explained_variance_ratio_:解释方差比


4.1 主成分可视化

first_pc = pca.components_[0]
second_pc = pca.components_[1]transformed_data = pca.transform(data)
for ii,jj in zip(transformed_data, data):plt.scatter( first_pc[0]*ii[0], first_pc[1]*ii[0], color="r")plt.scatter( second_pc[0]*ii[1], second_pc[1]*ii[1], color="c")plt.scatter( jj[0], jj[1], color="b")plt.xlabel("bonus")
plt.ylabel("long-term incentive")
plt.show()


图7 安然数据集

5. 在线可视化网站

通过这个网站,你可以更直观的了解到 PCA 降维的含义。



图8 3维数据主成分

参考文献

[1] Aurelien Geron, 王静源, 贾玮, 边蕤, 邱俊涛. 机器学习实战:基于 Scikit-Learn 和 TensorFlow[M]. 北京: 机械工业出版社, 2018: 191.

[2] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016: 53-56.229-233 .


推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 机器学习中的标准化缩放、最小-最大缩放及鲁棒缩放技术解析 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 在《Python编程基础》课程中,我们将深入探讨Python中的循环结构。通过详细解析for循环和while循环的语法与应用场景,帮助初学者掌握循环控制语句的核心概念和实际应用技巧。此外,还将介绍如何利用循环结构解决复杂问题,提高编程效率和代码可读性。 ... [详细]
author-avatar
awrjftyitik
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有